package cn.edu.ahpu.utils;

import java.util.Random;

import cn.edu.ahpu.pojo.Formula;

/**
 * 随机生成运算式子
 * @author Wildmess
 *
 */
public class RandomGenerate {

	/**
	 * 随机生成一个只含有加减乘除的四则运算式子
	 * 两个栈
	 * 数字栈，数字0~9随机生成
	 * 字符栈，+、-、*、/随机生成
	 * 且数字栈要比字符栈位数大一
	 * 
	 * 要求：
	 * 	/ 的前后要使其结果能整除
	 * 		尝试方法：若检测到字符栈的顶层元素为/，接下来生成的数字，只能是数字栈顶层元素的因子
	 * 				缺陷，仍然需要改进，如3*5/3，理论上可以整除，但这样的算法不能
	 *		
	 *		改进：出现 / 以后，计算前面的结果，看能不能整除接下来随机生成的数字，不能就重新随机生成
	 *			随机数生成前一个结果的因子，不确定性太大，容易内存溢出
	 *
	 *		问题有点多，决定直接条用double类型的算法，返回值为小数就说明没有整除，重新生成
	 *		
	 * @param len 运算符的数量
	 * @return
	 * @author Wildmess
	 */
	public static Formula randomZeroToHundred(Integer len) {
		char[] oper = {'+','-','*','/'};
		Random random = new Random();

		String equation = "";
		//无限循环，交替生成
		boolean flag = true;
		while(len!=0) {
			if(flag) {
				//flag为true时，拼接数字
				flag = false;
				equation += random.nextInt(101);
			}else {
				//为false时，生成运算符
				flag = true;
				equation += oper[random.nextInt(4)];
				len--;
			}
		}
		equation += random.nextInt(101);

		Formula formula = new Formula(equation,1);
		return formula;
	}

	/**
	 * 检验算式的结果
	 * @param formula
	 * @return
	 */
	public static boolean checkFormula(Formula formula) {
		String strAnswer = String.valueOf(formula.getAnswer());
		//检验，剔除不需要的式子
		//获取结果的整数位数据
		int pointIndex = formula.getAnswer().toString().indexOf(".");
		if(pointIndex<=0) {
			return false;
		}

		if(formula.getAnswer()<0 ) {
			//结果为负数，舍去
			return false;
		}

		int intAnswer = Integer.valueOf(strAnswer.substring(0, pointIndex));
		if(intAnswer!=formula.getAnswer()) {
			//小数位有非0数字存在，舍去
			return false;
		}
		
		//有的由于结果过小，Java自动将其转成了科学计数法，这里直接舍去
		if(strAnswer.indexOf('E')>0) {
			return false;
		}
		return true;
	}
	
	/**
	 * 随机生成带括号的算式
	 * @param len
	 * @return
	 */
	public static Formula randomWithbrack(Integer len) {
		
		return null;
	}
}
